package com.quwan.app.service;

import com.quwan.app.vo.*;
import com.quwan.app.vo.pay.BuyItParams;
import com.quwan.app.vo.pay.PrePayment;
import com.quwan.common.result.PageResult;
import com.quwan.entity.C2cOrder;
import com.quwan.manager.controller.dto.OrderDTO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author quan
 * @date 2021-06-10 15:49
 */

public interface OrderService {
    /**
     * 会员发单
     *
     * @param params
     */
    boolean memberPublishOrder(PublishOrderVo params);

    /**
     * app 首页发单列表（同城） 排序规则按照经纬度计算距离 最近优先
     *
     * @param pageNo
     * @param pageSize
     * @param lat
     * @param lng
     * @param categoryId
     * @return
     */

    PageResult<PublishOrderSimple> appPublishOrderList(int pageNo,
                                                       int pageSize,
                                                       BigDecimal lat,
                                                       BigDecimal lng,
                                                       String categoryId,
                                                       String type,
                                                       String autoWhere,
                                                       String priceDesc,
                                                       Integer age,
                                                       String cityName,
                                                       String cityCode,
                                                       String gender,
                                                       String parentCate,
                                                       String keyword);

    /**
     * 服务订单 详情
     *
     * @param publishOrderId
     * @return
     */

    PublishOrderSimple getPublishOrderDetails(String mId, String publishOrderId);

    /**
     * 下单
     *
     * @param publishOrderId
     * @param memberId
     * @return
     */

    BuyItOrderDTO buyIt(String publishOrderId, String memberId);

    /**
     * 支付
     *
     * @param params
     * @param prePaymentInterface
     * @return
     */

    PrePayment payOrder(String mId, BuyItParams params, PrePaymentInterface prePaymentInterface);

    /**
     * 修改消费订单状态
     *
     * @param orderId
     * @param status
     * @return
     */

    boolean changeC2cOrderStatusById(String mId, String orderId);

    /**
     * 会员发单 列表
     *
     * @param pageNo
     * @param pageSize
     * @param memberId
     * @param type
     * @return
     */

    PageResult<PublishOrderSimple> memberPublishOrderList(int pageNo, int pageSize, String memberId,Integer status);

    /**
     * 会员接单 （服务提供者）
     *
     * @param pageNo
     * @param pageSize
     * @param memberId
     * @param status
     * @return
     */
    PageResult<PublishOrderInfo> memberServiceOrderList(int pageNo, int pageSize, String memberId, Integer status);

    /**
     * 会员下单（消费者）
     *
     * @param pageNo
     * @param pageSize
     * @param memberId
     * @param status
     * @return
     */

    PageResult<PublishOrderInfo> memberConsumeOrderList(int pageNo, int pageSize, String memberId, Integer status);

    /**
     * 订单列表(后台)
     *
     * @param page
     * @param size
     * @param orderId
     * @param p_member
     * @param c_member
     * @param category
     * @param address
     * @param orderStatus
     * @param beginTime
     * @param endTime
     * @param publishBeginTime
     * @param publishEndTime
     * @return
     */

    PageResult<OrderDTO> getOrderList(int page, int size, String orderId, String p_member, String c_member, String category, String address, String orderStatus, String beginTime, String endTime, String publishBeginTime, String publishEndTime, String publishMemberId, String consumerMemberId);

    /**
     * 查询发单图片信息
     *
     * @param publishOrderId 发单id
     * @return
     */
    List<String> publishOrderImgs(Long publishOrderId);


    /**
     * app 首页推荐数据列表 关注
     *
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<PublishOrderSimple> appPublishOrderList(int pageNo, int pageSize, String mId);

    /**
     * 消费订单详情信息
     *
     * @param consumerOrderId
     * @param type            0查询服务者信息  1 查询消费者信息
     * @return
     */
    ConsumeOrderDetailsDTO consumeOrderDetails(String consumerOrderId, String type);

    /**
     * 评论订单
     *
     * @param orderId        消费订单
     * @param type           0差评 1中评 2好评
     * @param tag            内容标签
     * @param mId            评论会员id
     * @param commentContent 内容
     * @return
     */

    boolean commentOrder(String orderId, String type, List<String> tag, String mId, String commentContent);

    /**
     * 会员 订单评论 列表
     *
     * @param pageNo
     * @param pageSize
     * @param id      发单id
     * @return
     */

    OrderCommentDTO getMemberOrderCommentList(int pageNo, int pageSize, String id);

    /**
     * 编辑会员发单信息
     *
     * @param publishOrderId 发单id
     * @param price          价格
     * @param ageLimit       年龄要求
     * @param genderLimit    性别要求
     * @param timeLimit      时间要求
     * @param otherDesc      简介
     * @return
     */

    boolean editPublishOrderInfo(String mId, String publishOrderId, String price, String ageLimit, String genderLimit, List<String> timeLimit, String otherDesc, List<String> url);


    /**
     * 根据订单id查询订单信息
     *
     * @param id
     * @return
     */
    C2cOrder getC2cOrderInfoById(String id);

    /**
     * 消费者确认订单
     *
     * @param mId 会员id
     * @param id  订单id
     * @return
     */
    boolean confirmOrder(String mId, String id);

    /**
     * @param mId    会员id
     * @param id     订单id
     * @param reason 取消原因
     * @return
     */

    boolean cancelOrder(String mId, String id, String reason);

    /**
     * 删除我发布的订单
     *
     * @param mId
     * @param id  发单id
     * @return
     */
    boolean delPublishOrder(String mId, String id);

    /**
     * 订单内容编辑 数据查询
     *
     * @param mId
     * @param id
     * @return
     */
    EditPublishOrderDTO editPublishOrderShowData(String mId, String id);

    /**
     * 查看目标用户发单信息
     *
     * @param pageNo
     * @param pageSize
     * @param target
     * @return
     */
    PageResult<Map> catMemberPublishOrderList(int pageNo, int pageSize, String target);

    /**
     * 取消超时未接的订单
     *
     * @param orderId
     */
    void cancelNotProcessTimeOutOrder(String orderId);

    /**
     * 取消超时未支付且有优惠的订单
     *
     * @param orderId
     */
    void cancelTimeOutOrder(String orderId);

    /**
     * 未处理完成的 下单数 接单数
     *
     * @param mId 用户id
     * @return
     */
    OrderAwaitCountDTO getAwaitProcessOrderCount(String mId);

    /**
     * 订单id查询用户id
     * @param id
     * @return
     */
    String getMIdByOrderId(String id);

    /**
     * 下架我发布的订单
     * @param mId
     * @param orderId
     * @return
     */
    boolean hidePublishOrder(String mId, String orderId);

    /**
     * 用户是否存在发单订单
     * @param id
     * @return
     */
    Boolean existsPublishOrder(String id);

    /**
     * 用户是否存在购买订单
     * @param id
     * @return
     */
    Boolean existsBuyItOrder(String id);

    boolean checkPublishOrder(Long mId);
}
